package sword.offer.breakthrough;

/**
 * 给你一个整数数组 nums ，除某个元素仅出现 一次 外，其余每个元素都恰出现 三次 。请你找出并返回那个只出现了一次的元素。
 * @author 胡宇轩
 * @Email: yuxuan.hu01@bianlifeng.com
 */
public class Fourth {
    /**
     * 20:06
     * 二刷题
     * 其他元素出现了三次，那么他们的二进制形式的1位数量和是3的倍数。
     *
     * 获取一个元素的最低位 可以通过 n & 1;
     * 依次获取每一位，int为32位 故外循环32次
     *
     * */
    class Solution {
        public int singleNumber(int[] nums) {
            int result = 0;
            for (int i = 0; i < 32; i++) {
                int count = 0;
                for (int n : nums){
                    n >>= i;
                    count += (n & 1);
                }
                if(count % 3 != 0){
                    result += 1 << i;
                }
            }
            return result;
        }
    }
}
